/* 
 * scale.h
 *
 * Choi Jonghwan<saxboy@saxboy.pe.kr>
 * 2006/04/26
 */

#ifndef __SCALE_H__
#define __SCALE_H__

#include "note.h"
#include "parse.h"

#define MAX_NOTES_PER_SCALE 12

typedef enum __scale_type 
{
	SCALE_NONE=0, 
	SCALE_MAJOR, 
	SCALE_MINOR, 
	SCALE_NATURAL_MINOR, 
	SCALE_HARMONIC_MINOR, 
	SCALE_MELODIC_MINOR, 
	SCALE_AUGMENTED, 
	SCALE_WHOLETONE, 
	SCALE_DIMINISHED_HW, 
	SCALE_DIMINISHED_WH, 
	SCALE_PENTATONIC, 
	SCALE_DOMINANT, 
	SCALE_BLUES, 
	SCALE_BEBOP, 

	SCALE_LYDIAN_DOMINANT,	/* C7+4 */ 

	SCALE_USER_DEFINED, 

} SCALE_TYPE; 


typedef struct __SCALE {

	int note_count; 
	int notes[MAX_NOTES_PER_SCALE]; 

	SCALE_TYPE type; 
	int mode;	/* modes */ 

	int root; 

} _SCALE; 
typedef _SCALE *SCALE; 


/* public scale API's */

SCALE scale_New(void);
SCALE scale_NewFromDefinition(int abs_note, char *scaledef);
SCALE scale_NewPredefined(int abs_note, SCALE_TYPE type); 
SCALE scale_NewPredefinedWithMode(int abs_note, SCALE_TYPE type, int mode); 

int scale_Delete(SCALE s);
int scale_ImportDefinition(SCALE s, char *scaledef);

int scale_SetType(SCALE s, SCALE_TYPE type); 
int scale_SetTypeWithMode(SCALE s, SCALE_TYPE type, int mode); 
int scale_GetType(SCALE s); 

int scale_GetNoteCount(SCALE s); 
int scale_GetNote(SCALE s, int n); 
int scale_AddNote(SCALE s, int abs_note);

int scale_SetMode(SCALE s, int mode); 
int scale_GetMode(SCALE s); 

int scale_SetRoot(SCALE s, int abs_note); 
int scale_GetRoot(SCALE s); 

int scale_Print(SCALE s);
int scale_ExportToString(SCALE s, char *buf, int buflen); 


#endif /* __SCALE_H__ */



